package com.bdqn.demo;

import com.bdqn.pojo.Student;

import java.lang.reflect.Modifier;

/**
 * 示例1：通过反射获取类的基本信息
 *
 * @author LILIBO
 * @since 2022-09-15
 */
public class Demo01 {

    public static void main(String[] args) {
        // 获取到Class对象的方法（三种）

        // 方式一：通过对象的.getClass()方法获取Class对象
        Student student = new Student();
        Class clazz01 = student.getClass();
        System.out.println("Class.getSimpleName() 类型的简称: " + clazz01.getSimpleName());

        // 方式二：通过类名称.class获取Class对象
        Class clazz02 = Student.class;
        System.out.println("Class.getName() 类型的全限定名: " + clazz02.getName());

        // 方式三：通过Class.forName()方法获取Class对象
        Class clazz03 = null;
        try {
            // com.bdqn.pojo.Student$Score$Test
            clazz03 = Class.forName("com.bdqn.pojo.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 获得所在包名
        System.out.println("Class.getPackage() 所在包名称: " + clazz03.getPackage());
        // 获得继承的父类
        System.out.println("Class.getSuperclass() 父类类型名称: " + clazz03.getSuperclass());
        // 获得实现的接口
        System.out.println("Class.getInterfaces() 所实现的接口：");
        Class[] interfaces = clazz03.getInterfaces();
        for (Class i : interfaces) {
            System.out.println("Class.getInterfaces() 所实现的接口: " + i.getName());
        }
        // 权限限定符，Modifier.PUBLIC等（public=1;private=2;protected=4;static=8;final=16;synchronized=32;volatile=64;transient=128;native=256;interface=512;abstract=1024;strict=2048）
        System.out.println("Modifier.PRIVATE: " + Modifier.PRIVATE + " " + Modifier.isStatic(Modifier.PRIVATE));
        System.out.println("Class.getModifiers() 类的权限类型: " + clazz03.getModifiers());
        // 内部类（写在类内部的类，可以有多个可以嵌套）
        System.out.println("Class.getDeclaredClasses() 所有的内部类：");
        Class[] declaredClasses = clazz03.getDeclaredClasses();
        for (Class d : declaredClasses) {
            System.out.println("Class.getDeclaredClasses() 内部类: " + d.getName());
        }
        // 外部类（针对内部类来说，它所在的类）
        System.out.println("Class.getDeclaringClass() 外部类名称: " + clazz03.getDeclaringClass());
    }
}
